home *** CD-ROM | disk | FTP | other *** search
/ Language/OS - Multiplatform Resource Library / LANGUAGE OS.iso / oper_sys / emerald / emrldsys.lha / Language / Compiler / genjump.c < prev    next >
C/C++ Source or Header  |  1990-08-16  |  3KB  |  98 lines

  1. #include "datadesc.h"
  2. #include "genutils.h"
  3. #include "allocate.h"
  4. #include "emit.h"
  5. #include "option.h"
  6.  
  7. static DD jumpDebugArea;
  8. static DD scratch;
  9. #define FIRSTTODEBUG MINALLOCATABLE
  10. #define LASTTODEBUG  MAXALLOCATABLE
  11. #define NUMTODEBUG (LASTTODEBUG - FIRSTTODEBUG + 1)
  12. static DD jumpDebugAll[NUMTODEBUG];
  13.  
  14. #define min(A, B) ((A) < (B) ? (A) : (B))
  15.  
  16. void jumpDebug()
  17. {
  18.   register int i;
  19.   DD reg, scratch_plus;
  20.   IFOPTION(debugstack, 1) {
  21.     assert (jumpDebugArea.value.address.base == regs_l);
  22.     reg = buildRegisterDDNC(regs_scratch);
  23.     scratch_plus = buildAddressDD(regs_scratch, 0);
  24.     scratch_plus.value.address.autoIncrement = TRUE;
  25.     emitMove(scratch, pusher, 'l');
  26.     emitMoveAddress(jumpDebugArea, scratch);
  27.     for (i = FIRSTTODEBUG; i <= LASTTODEBUG; i++) {
  28.       reg.value.address.offset = i;
  29.       emitMove(reg, scratch_plus, 'l');
  30.     }
  31.     emitMove(popper, scratch, 'l');
  32.   }
  33.   emit(SETLASTJUMPFROM);
  34. }
  35.  
  36. void jumpCheck()
  37. {
  38.   register int i;
  39.   DD reg, scratch_plus;
  40.   IFOPTION(debugstack, 1) {
  41.     reg = buildRegisterDDNC(regs_scratch);
  42.     scratch_plus = buildAddressDD(regs_scratch, 0);
  43.     scratch_plus.value.address.autoIncrement = TRUE;
  44.     emitMove(scratch, pusher, 'l');
  45.     emitMoveAddress(jumpDebugArea, scratch);
  46.     for (i = FIRSTTODEBUG; i <= LASTTODEBUG; i++) {
  47.       reg.value.address.offset = i;
  48.       emit("\tcmpl\t");
  49.       writeDD(scratch_plus, ',');
  50.       writeDD(reg, '\n');
  51.       emit("\tj%s\t7f\n", JN(EQL));
  52. #ifdef sun
  53.       emit("\tstop\t#0000\n");
  54. #endif
  55. #ifdef vax
  56.       emit("\thalt\n");
  57. #endif
  58.       emit("7:");
  59.     }
  60.     emitMove(popper, scratch, 'l');
  61.   }
  62. }
  63.  
  64. void initializeJumpDebug()
  65. {
  66.   register int i, diff;
  67.   IFOPTION(debugstack, 1) {
  68.     scratch = buildRegisterDDNC(regs_scratch);
  69.     jumpDebugArea = buildAddressDD(regs_l, 0);
  70.     for (i = 0; i < NUMTODEBUG; i++) {
  71.       jumpDebugAll[i] = buildAddressDD(regs_l, TS_Allocate(4, DataBrand));
  72.       assert(jumpDebugAll[i].value.address.offset < 0);
  73.       if (i == 0) {
  74.       } else if (i == 1) {
  75.     diff = jumpDebugAll[1].value.address.offset - jumpDebugAll[0].value.address.offset;
  76.     assert(diff == 4 || diff == -4);
  77.       } else {
  78.     assert(jumpDebugAll[i].value.address.offset - jumpDebugAll[i-1].value.address.offset == diff);
  79.       }
  80.       
  81.       if (jumpDebugAll[i].value.address.offset < jumpDebugArea.value.address.offset) {
  82.     jumpDebugArea = jumpDebugAll[i];
  83.       }
  84.     }
  85.   }
  86. }
  87.  
  88. void finalizeJumpDebug()
  89. {
  90.   register int i;
  91.   IFOPTION(debugstack, 1) {
  92.     for (i = 0; i < NUMTODEBUG; i++) {
  93.       TS_Free(jumpDebugAll[i].value.address.offset);
  94.     }
  95.     jumpDebugArea = nullDD;
  96.   }
  97. }
  98.